﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MainEntities
{
    public class User
    {
        private int _userID; // идентификатор пользователя
        public int UserID // передача идентификатора пользователя
        {
            get
            {
                return _userID;
            }

            set
            {
                if (value != _userID)
                    _userID = value;
            }
        }
        static int lastUserID = 0; // используется для генерации идентификаторов

        string name; // имя
        string surname; //фамилия
        string fathername; // отчество
        string post; //должность
        string labilities; // обязательства
        string phone; //телефон
        string mphone; // мобилка
        string email; // мыло
        string email2; //допмыло
        string login;
        private string password;
        bool actstatus; // true - актив/false - неактив
        bool isadmin; // статус админа
        bool issuper; // статус супервайзора
        bool isworker; // статус раотника
        public int level; // уровень иерархии по дереву
        public List<Task> userTasks; //список задач (нужность списка под вопросом)
        public User headuser; //начальник
        public List<User> suborders; //подчинённые

        // полный конструктор
        public User(string _name, string _surname, string _fathername, string _post, string _labilities,
                    string _phone, string _mphone, string _email, string _email2, string _login, string _password,
                    bool _actstatus, bool _isadmin, bool _issuper, bool _isworker, User _headuser, List<User> _suborders, List<Task> _userTasks)
        {
            UserID = getAvailableUserID();
            name = _name;
            surname = _surname;
            fathername = _fathername;
            post = _post;
            labilities = _labilities;
            phone = _phone;
            mphone = _mphone;
            email = _email;
            email2 = _email2;
            login = _login;
            password = _password;
            actstatus = _actstatus;
            isadmin = _isadmin;
            issuper = _issuper;
            isworker = _isworker;
            if (isadmin && !issuper) isworker = true; // админ не являющийся супервайзером должен иметь полномочия работника
            headuser = _headuser;
            if (headuser != null) level = headuser.level + 1;
            else level = 0;
            if ((_suborders != null) && (_suborders.Count > 0))
            {
                suborders = new List<User>(_suborders);
                foreach (User sub in suborders) sub.headuser = this;
                setLevelForSuborders();
            }
            else
                suborders = new List<User>();

            if ((_userTasks != null) && (_userTasks.Count > 0))
                userTasks = new List<Task>(_userTasks);
            else
                userTasks = new List<Task>();
        }

        // типовой конструктор
        public User(string _name, string _surname, string _fathername, string _post, string _labilities,
                string _phone, string _mphone, string _email, string _email2, string _login, bool _isadmin, bool _issuper, User _headuser, List<User> _suborders)
        {
            UserID = getAvailableUserID();
            name = _name;
            surname = _surname;
            fathername = _fathername;
            post = _post;
            labilities = _labilities;
            phone = _phone;
            mphone = _mphone;
            email = _email;
            email2 = _email2;
            login = _login;
            password = generatePassword();
            actstatus = true;
            isadmin = _isadmin;
            issuper = _issuper;
            isworker = false;
            if (!issuper) isworker = true; // юзер не являющийся супервайзером должен иметь полномочия работника
            headuser = _headuser;
            if (headuser != null) level = headuser.level + 1;
            else level = 0;
            if ((_suborders != null) && (_suborders.Count > 0))
            {
                suborders = new List<User>(_suborders);
                foreach (User sub in suborders) sub.headuser = this;
                setLevelForSuborders();
            }
            else
                suborders = new List<User>();
            userTasks = new List<Task>();
            sendLogPass();
        }

        ~User() // деструктор (удаление профиля), нуждается в доработке (пока неясно нужен ли вообще список задач, если нужен нужна реализация освобождения задач)
        {
            foreach (User sub in suborders)
            {
                sub.level = 0;
                sub.setLevelForSuborders();
            }
        }

        public void setLevelForSuborders() // вспомогательный метод - определяет и задаёт уровень иерархии всем подчинённым и их подчинённым
        {
            if ((suborders != null) && (suborders.Count > 0))
                foreach (User sub in suborders)
                {
                    sub.level = this.level + 1;
                    sub.setLevelForSuborders();
                }
        }

        private string generatePassword() // заглушка генератора пароля (принцип генерации нуждается в разработке)
        { return "12345"; }

        private void sendLogPass() // заглушка. будет отсылать логин/пароль на мыло когда начнём прогать сетевую часть (возможно этот метод здесь и не нужен и будет написан в интерфейсной части)
        { }

        // редактирование профиля пользователя. в доработке нуждается проверка логинов на существование и поиск их по всей базе
        public void edit(string _name, string _surname, string _fathername, string _post, string _labilities,
                    string _phone, string _mphone, string _email, string _email2, string _login, bool _isadmin, bool _issuper, User _headuser, List<User> _suborders, List<Task> _userTasks)
        {
            name = _name;
            surname = _surname;
            fathername = _fathername;
            post = _post;
            labilities = _labilities;
            phone = _phone;
            mphone = _mphone;
            email = _email;
            email2 = _email2;
            login = _login;
            isadmin = _isadmin;
            issuper = _issuper;
            if (isadmin && !issuper) isworker = true; // админ не являющийся супервайзером должен иметь полномочия работника
            headuser = _headuser;
            if (headuser != null) level = headuser.level + 1;
            else level = 0;
            if ((_suborders != null) && (_suborders.Count > 0))
            {
                suborders = new List<User>(_suborders);
                foreach (User sub in suborders) sub.headuser = this;
                setLevelForSuborders();
            }
            else
                suborders = new List<User>();
        }


        public void addSuborderUser(User subUser) // Вспом метод. Добавляет юзера в список подчинённых текущего пользователя. Будет использоваться при редактировании связей
        {
            if (subUser != null)
            {
                suborders.Add(subUser);
                issuper = true; // пользователь становится супервайзером
                subUser.headuser = this;
                subUser.level = this.level + 1;
                subUser.setLevelForSuborders();
            }
        }

        public void removeSuborderUser(User subUser) // Вспом метод. Удаляет юзера из списка подчинённых текущего. Будет использоваться при редактировании связей
        {
            if (suborders.Contains(subUser))
            {
                suborders.Remove(subUser);
                subUser.headuser = null;
                subUser.level = 0;
                subUser.setLevelForSuborders();
            }
        }

        public void setNewPassword(String oldpassword, String newpassword) // меняет пароль на новый
        {
            if (oldpassword == password) password = newpassword;
        }



        public void deactivateUser() // делают юзера неактивным
        {
            actstatus = false;
        }
        public void activateUser() // делает юзера активным
        {
            actstatus = true;
        }

        static int getAvailableUserID() // упрощенный генератор идентификаторов юзера
        {
            return ++lastUserID;
        }
    }
}